JAVA~适合新手和复习~基础五(IO流、Stream流)

您所在的位置:网站首页 java stream流 JAVA~适合新手和复习~基础五(IO流、Stream流)

JAVA~适合新手和复习~基础五(IO流、Stream流)

#JAVA~适合新手和复习~基础五(IO流、Stream流) | 来源: 网络整理| 查看: 265

IO流

一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

 

 

FileInputStream

该流用于从文件读取数据,它的对象可以用关键字 new 来创建。

有多种构造方法可用来创建对象。

可以使用字符串类型的文件名来创建一个输入流对象来读取文件:

InputStream f = new FileInputStream("C:/java/hello");

也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:

File f = new File("C:/java/hello"); InputStream in = new FileInputStream(f);

创建了InputStream对象,就可以使用下面的方法来读取流或者进行其他的流操作

序号方法及描述 1 public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 2 protected void finalize()throws IOException {} 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 3 public int read(int r)throws IOException{} 这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。 4 public int read(byte[] r) throws IOException{} 这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。 5 public int available() throws IOException{} 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。 FileOutputStream

该类用来创建一个文件并向文件中写数据。如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。有两个构造方法可以用来创建 FileOutputStream 对象。

1 //使用字符串类型的文件名来创建一个输出流对象: 2 OutputStream f = new FileOutputStream("C:/java/hello") 3 //使用字符串类型的文件名来创建一个输出流对象: 4 File f = new File("C:/java/hello"); 5 OutputStream fOut = new FileOutputStream(f);

创建OutputStream 对象完成后,就可以使用下面的方法来写入流或者进行其他的流操作。

序号方法及描述 1 public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 2 protected void finalize()throws IOException {} 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 3 public void write(int w)throws IOException{} 这个方法把指定的字节写到输出流中。 4 public void write(byte[] w) 把指定数组中w.length长度的字节写到OutputStream中。 实例 1 //文件名 :fileStreamTest2.java 2 import java.io.*; 3 4 public class fileStreamTest2 { 5 public static void main(String[] args) throws IOException { 6 7 File f = new File("a.txt"); 8 FileOutputStream fop = new FileOutputStream(f); 9 // 构建FileOutputStream对象,文件不存在会自动新建 10 11 OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8"); 12 // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk 13 14 writer.append("中文输入"); 15 // 写入到缓冲区 16 17 writer.append("\r\n"); 18 // 换行 19 20 writer.append("English"); 21 // 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入 22 23 writer.close(); 24 // 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉 25 26 fop.close(); 27 // 关闭输出流,释放系统资源 28 29 FileInputStream fip = new FileInputStream(f); 30 // 构建FileInputStream对象 31 32 InputStreamReader reader = new InputStreamReader(fip, "UTF-8"); 33 // 构建InputStreamReader对象,编码与写入相同 34 35 StringBuffer sb = new StringBuffer(); 36 while (reader.ready()) { 37 sb.append((char) reader.read()); 38 // 转成char加到StringBuffer对象中 39 } 40 System.out.println(sb.toString()); 41 reader.close(); 42 // 关闭读取流 43 44 fip.close(); 45 // 关闭输入流,释放系统资源 46 47 } 48 } Java中的目录(和Linux的几乎一样) 创建目录: 文件类中有两个方法可以用来创建文件夹: mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。 mkdirs()方法创建一个文件夹和它的所有父文件夹。

例子

1 import java.io.File; 2 3 public class CreateDir { 4 public static void main(String[] args) { 5 String dirname = "/tmp/user/java/bin"; 6 File d = new File(dirname); 7 // 现在创建目录 8 d.mkdirs(); 9 } 10 } 读取目录

一个目录其实就是一个 File 对象,它包含其他文件和文件夹。

如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。

可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。

下面展示的例子说明如何使用 list() 方法来检查一个文件夹中包含的内容:

1 import java.io.File; 2 3 public class DirList { 4 public static void main(String args[]) { 5 String dirname = "/tmp"; 6 File f1 = new File(dirname); 7 if (f1.isDirectory()) { 8 System.out.println("目录 " + dirname); 9 String s[] = f1.list(); 10 for (int i = 0; i < s.length; i++) { 11 File f = new File(dirname + "/" + s[i]); 12 if (f.isDirectory()) { 13 System.out.println(s[i] + " 是一个目录"); 14 } else { 15 System.out.println(s[i] + " 是一个文件"); 16 } 17 } 18 } else { 19 System.out.println(dirname + " 不是一个目录"); 20 } 21 } 22 } 23 24 25 以上实例编译运行结果如下: 26 27 目录 /tmp 28 bin 是一个目录 29 lib 是一个目录 30 demo 是一个目录 31 test.txt 是一个文件 32 README 是一个文件 33 index.html 是一个文件 34 include 是一个目录 删除目录或文件

删除文件可以使用 java.io.File.delete() 方法。

以下代码会删除目录 /tmp/java/,需要注意的是当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。

测试目录结构:

/tmp/java/ |-- 1.log |-- test

import java.io.File; public class DeleteFileDemo { public static void main(String[] args) { // 这里修改为自己的测试目录 File folder = new File("/tmp/java/"); deleteFolder(folder); } // 删除文件及目录 public static void deleteFolder(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { deleteFolder(f); } else { f.delete(); } } } folder.delete(); } } 从控制台读取多字符输入 1 //使用 BufferedReader 在控制台读取字符 2 3 import java.io.*; 4 5 public class BRRead { 6 public static void main(String[] args) throws IOException { 7 char c; 8 // 使用 System.in 创建 BufferedReader 9 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 10 System.out.println("输入字符, 按下 'q' 键退出。"); 11 // 读取字符 12 do { 13 c = (char) br.read(); 14 System.out.println(c); 15 } while (c != 'q'); 16 } 17 }

以上实例编译运行结果如下:

输入字符, 按下 'q' 键退出。 runoob r u n o o b q q 从控制台读取字符串 //使用 BufferedReader 在控制台读取字符 import java.io.*; public class BRReadLines { public static void main(String[] args) throws IOException { // 使用 System.in 创建 BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; System.out.println("Enter lines of text."); System.out.println("Enter 'end' to quit."); do { str = br.readLine(); System.out.println(str); } while (!str.equals("end")); } }

以上实例编译运行结果如下:

Enter lines of text. Enter 'end' to quit. This is line one This is line one This is line two This is line two end end 控制台输出 1 import java.io.*; 2 3 //演示 System.out.write(). 4 public class WriteDemo { 5 public static void main(String[] args) { 6 int b; 7 b = 'A'; 8 System.out.write(b); 9 System.out.write('\n'); 10 } 11 }

运行以上实例在输出窗口输出 "A" 字符

A IO流的几种分类

按流向分(站在程序角度考虑)

输入流(input)输出流(outpu)

 

 

按类型分:字节流(InputStream/OutputStream)任何文件都可以通过字节流进行传输。

字符流(Reader/Writer)非纯文本文件,不能用字符流,会导致文件格式破坏,不能正常执行。

节点流(低级流:直接跟输入输出源对接)FileInputStream/FileOutputStream/FileReader/FileWriter/PrintStream/PrintWriter.

处理流(高级流:建立在低级流的基础上)转换流:InputStreamReader/OutputStreamWriter,字节流转字符流/字符流转字节流缓冲流:BufferedInputStream/BufferedOutputStream BufferedReader/BufferedReader可对节点流经行包装,使读写更快

Stream

 

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

 

 

+--------------------+ +------+ +------+ +---+ +-------+ | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect| +--------------------+ +------+ +------+ +---+ +-------+有没有英语和我一样差的,哈哈 +--------------------+ +------+ +------+ +---+ +-------+ | 元素流 +-----> | 过滤 +-> | 排序 +-> |映射+-> | 收集 | +--------------------+ +------+ +------+ +---+ +-------+

以上的流程转换为 Java 代码为:

List transactionsIds = widgets.stream() .filter(b -> b.getColor() == RED) .sorted((x,y) -> x.getWeight() - y.getWeight()) .mapToInt(Widget::getWeight) .sum(); 什么是 Stream?

Stream(流)是一个来自数据源的元素队列并支持聚合操作

.元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。 .数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。 .聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同, Stream操作还有两个基础的特征:

*Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。 *内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

 

生成流

在 Java 8 中, 集合接口有两个方法来生成流:

stream() − 为集合创建串行流。

parallelStream() − 为集合创建并行流。 List strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

示例

1 long count = strings.stream() //声明作为流处理 2 .filter(e -> e.isEmpty()) //中间操作,过滤空元素 3 .count(); //结束操作,计算

是不是想问count又是干嘛用的??不要着急嘛来看下文!

中间操作 过滤filter

filter()方法用于通过设置的条件过滤出元素

1 List strings =Arrays.asList("aa", "bb", "cc", "", ""); 2 long count = strings.stream() //声明作为流处理 3 .filter(e -> e.isEmpty()) //中间操作,过滤空元素 4 .count(); //结束操作,计算 5 System.out.println(count);

Stream流 属于延迟执行,只有调用了结束操作,才能触发整个的执行。如果未定义结束操作,那么流处理什么也不会做。

筛选limit/skip

limit()方法用于获取指定数量的流(前n个),skip()方法用于去除指定数量的流(前n个)

1 Random random = new Random(); 2 random.ints() 3 .limit(10) 4 .skip(5) 5 .forEach(value -> System.out.println(value)); 映射map

map()方法用于映射每个元素到对应的结果,其实就是对结果进行转化

List integers = Arrays.asList(3, 2, 5, 4, 6, 8, 9, 1); List list = integers.stream() .map(i -> i * i) .collect(Collectors.toList()); System.out.println(list.toString());

 

排序sorted

sorted()方法通过Comparable接口对流进行排序,也可以自定义

Random random = new Random(); random.ints().limit(10) .sorted() .forEach(System.out::println);

使用Comparator 来排序一个list

说明:统计学生毕业后薪资,将同学按年龄由大到小进行排序

ArrayList students = new ArrayList(); students.add(new Student("zx",28,8000)); students.add(new Student("zr",29,8500)); students.add(new Student("zt",25,8000)); students.add(new Student("zy",35,10000)); students.add(new Student("zu",22,6000)); //默认升序排列,使用reversed()达到降序效果 students.stream().sorted(Comparator.comparing(Student::getAge).reversed()) .forEach(System.out::println);

通过Comparator.thenComparing(Comparator



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3